package c05面向对象;

/**
 * 对象的属性不具备多态性。如果子类里定义一个与父类相同的field，那么通过父类对象调用时调用的还是父类的field！(@@0)
 * 李刚老师的疯狂Java讲义说子类可以重写父类的静态方法，但是经过测试发现是不可以的！(@@1、2、3)
 * 重写是实现多态的方式之一（另一个是重载??），但是父类静态方法是属于类的，而不属于任何实例。
 * 在子类里虽然可以定义一模一样的静态方法，但其实是一个新定义的静态方法，这个方法无法通过父类对象多态调用！
 *
 * @author 炜sama
 */
public class 子类重写父类方法和多态测试 extends Father {
	public int field = 1;

	public static void main(String[] args) {
		子类重写父类方法和多态测试 test = new 子类重写父类方法和多态测试();
		System.err.println(test.field);
		test.m();//这里调用的是子类的m。
		子类重写父类方法和多态测试.ms();//这里调用的是子类的ms。

		Father f = test;
		System.err.println(f.field);//输出的还是父类的field！！@@0
		f.m();//这里调用的是子类的m！！这是多态的表现。@@1
		f.ms();//这里调用的是父类的ms！！不符合多态调用！@@2
	}

	//不管是private还是public，这都不是重写！
	public void mpri() {
		System.err.println("sun-mpri");
	}

	//只能重写实例方法m！两小：1、返回值只能是Object或其子类，即与父类相同或者更小！
	//2、访问修饰符不能比父类的public更小！
	@Override
	public Integer m() {
//		super.m();//父类实例方法的调用方式
		System.err.println("sun-m");
		return null;
	}

	//@@3当在这个方法上面添加注解 @Override 时提示错误！说明实际上子类不能重写父类静态方法！
	//详情可见下面例子证明：
	public static Object ms() {
		System.err.println("sun-ms");
		return null;
	}

}

class Father {
	public int field = 0;

	private void mpri() {
		System.err.println("Father-mpri");
	}

	public Object m() {
		System.err.println("Father-m");
		return null;
	}

	public static Object ms() {
		System.err.println("Father-ms");
		return null;
	}
}